﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Knights.Recursos;

namespace Knights.Objeto
{
    abstract class Objeto : IObjeto
    {
        private int dimensionLado = 1;

        private Vector3 escala = new Vector3(1);
        private Vector3 rotacion = new Vector3(0);

        private Modelo modelo;
        protected Vector3 posicion;

        private float distancia;
        protected bool colisionActivada;
        private Matrix world;

        public Objeto(Modelo modelo, Vector3 posicion)
        {
            this.modelo = modelo;
            this.posicion = new Vector3(posicion.X, posicion.Z, posicion.Y);
            colisionActivada = true;
        }

        public virtual void Actualizar()
        {
            world = Matrix.CreateScale(escala) * Matrix.CreateFromYawPitchRoll(rotacion.Y, rotacion.X, rotacion.Z) * Matrix.CreateTranslation(posicion);
            distancia = Vector3.Distance(posicion, Mundo.PersonajePrincipal.Posicion);
        }

        public void Dibujar(Effect efecto)
        {
            efecto.Parameters["tex"].SetValue(Texturas.Textura1);
            efecto.Parameters["ambient"].SetValue(Color.White.ToVector4());

            modelo.Dibujar(Matrix.CreateTranslation(posicion.X, posicion.Y, posicion.Z), efecto);
        }

        //public void Destruir()
        //{
        //    Mundo.Objetos.Remove(this);
        //}

        protected bool Colisiona(float posicionX, float posicionY)
        {
            bool colisiona = false;
            foreach (IObjeto objeto in Mundo.Objetos)
            {
                if (objeto.ColisionActivada && objeto.Superficie.Contains((int)posicionX, (int)posicionY))
                {
                    colisiona = true;
                    break;
                }
            }

            return colisiona;
        }

        public float Distancia { get { return distancia; } }

        public bool ColisionActivada { get { return colisionActivada; } }

        public Rectangle Superficie
        {
            get { return new Rectangle((int)posicion.X, (int)posicion.Y, dimensionLado, dimensionLado); }
        }

        public int CompareTo(object obj)
        {
            IObjeto objeto = (IObjeto)obj;

            return (int)((objeto.Distancia - this.Distancia) * 1000);
        }
    }
}
